package com.market.service.impl;

import com.market.entity.User;
import com.market.mapper.UserMapper;
import com.market.service.UserService;
import com.market.utils.PageResult;
import com.market.utils.PasswordUtil;
import com.market.utils.SessionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User login(String userCode, String passWord) {
        User user = userMapper.getByUserCode(userCode);

        //判断用户名对应的用户是否存在
        if(null != user){
            System.out.println(user);
            System.out.println(user.getRole());
            //验证用户对应的密码是否正确
            if(PasswordUtil.match(passWord,user.getUserPassword())){
                //脱敏处理
                user.setUserPassword(null);
                user.setSalt(null);
                return user;
            }
        }
        return null;
    }
    
    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    @Override
    public User findById(Long id) {
        return userMapper.findById(id);
    }
    
    @Override
    public PageResult<User> findByPage(String userName, String userCode, Integer currentPage, Integer pageSize) {
        // 计算偏移量
        Integer offset = (currentPage - 1) * pageSize;
        
        // 查询分页数据
        List<User> users = userMapper.findByPage(userName, userCode, offset, pageSize);
        
        // 查询总记录数
        int totalCount = userMapper.countByCondition(userName, userCode);
        
        // 返回分页结果
        return new PageResult<>(currentPage, pageSize, (long) totalCount, users);
    }

    @Override
    public Map<String, Object> add(User user) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 设置创建时间 - 使用java.sql.Timestamp
            user.setCreationDate(new java.sql.Timestamp(System.currentTimeMillis()));
            
            // 设置创建者(当前登录用户)
            Long currentUserId = SessionUtil.getCurrentUserId();
            if (currentUserId != null) {
                user.setCreatedBy(currentUserId);
            } else {
                // 如果无法获取当前用户ID，则设置为默认系统用户ID
                user.setCreatedBy(1L); // 设置默认管理员ID
            }
            
            // 设置用户状态，默认为1（正常状态）
            if (user.getStatus() == null) {
                user.setStatus(1);
            }
            
            // 处理密码加密
            String salt = PasswordUtil.generateSalt();
            user.setSalt(salt);
            user.setUserPassword(PasswordUtil.encode(user.getUserPassword(), salt));
            
            int rows = userMapper.add(user);
            if (rows > 0) {
                result.put("flag", true);
                result.put("message", "添加用户成功");
                result.put("data", user);
            } else {
                result.put("flag", false);
                result.put("message", "添加用户失败");
            }
        } catch (Exception e) {
            result.put("flag", false);
            result.put("message", "添加用户失败: " + e.getMessage());
        }
        
        return result;
    }

    @Override
    public boolean update(User user) {
        // 设置修改时间 - 使用java.sql.Timestamp
        user.setModifyDate(new java.sql.Timestamp(System.currentTimeMillis()));
        
        // 设置修改者(当前登录用户)
        Long currentUserId = SessionUtil.getCurrentUserId();
        if (currentUserId != null) {
            user.setModifyBy(currentUserId);
        } else {
            // 如果无法获取当前用户ID，则设置为默认系统用户ID
            user.setModifyBy(1L); // 设置默认管理员ID
        }
        
        return userMapper.update(user) > 0;
    }
    
    @Override
    public Map<String, Object> updateStatus(Long id, Integer status) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 先查询用户信息以便更新修改时间和修改人
            User user = new User();
            user.setId(id);
            user.setStatus(status);
            
            // 设置修改时间
            user.setModifyDate(new java.sql.Timestamp(System.currentTimeMillis()));
            
            // 设置修改者(当前登录用户)
            Long currentUserId = SessionUtil.getCurrentUserId();
            if (currentUserId != null) {
                user.setModifyBy(currentUserId);
            } else {
                // 如果无法获取当前用户ID，则设置为默认系统用户ID
                user.setModifyBy(1L); // 设置默认管理员ID
            }
            
            int rows = 0;
            if (user.getModifyBy() != null) {
                // 如果有修改者ID，使用带修改者信息的方法
                rows = userMapper.updateStatusWithModifier(id, status, user.getModifyBy(), user.getModifyDate());
            } else {
                // 否则使用简单的更新状态方法
                rows = userMapper.updateStatus(id, status);
            }
            
            if (rows > 0) {
                result.put("flag", true);
                result.put("message", "更新用户状态成功");
            } else {
                result.put("flag", false);
                result.put("message", "更新用户状态失败，可能用户不存在");
            }
        } catch (Exception e) {
            result.put("flag", false);
            result.put("message", "更新用户状态失败: " + e.getMessage());
        }
        
        return result;
    }

    @Override
    public boolean deleteById(Long id) {
        return userMapper.deleteById(id) > 0;
    }

    @Override
    public boolean updatePassword(Long id, String oldPassword, String newPassword) {
        // 先查询用户信息
        User user = userMapper.findById(id);
        if (user == null) {
            return false;
        }
        
        // 验证旧密码
        if (!PasswordUtil.match(oldPassword, user.getUserPassword())) {
            return false;
        }
        
        // 更新密码
        String salt = PasswordUtil.generateSalt();
        String encodedPassword = PasswordUtil.encode(newPassword, salt);
        
        user.setUserPassword(encodedPassword);
        user.setSalt(salt);
        
        // 设置修改时间 - 使用java.sql.Timestamp
        user.setModifyDate(new java.sql.Timestamp(System.currentTimeMillis()));
        
        // 设置修改者(当前登录用户)
        Long currentUserId = SessionUtil.getCurrentUserId();
        if (currentUserId != null) {
            user.setModifyBy(currentUserId);
        } else {
            // 如果无法获取当前用户ID，则设置为默认系统用户ID
            user.setModifyBy(1L); // 设置默认管理员ID
        }
        
        return userMapper.updatePassword(user) > 0;
    }
}
